package com.jusfoun.communication.dao.impl;

import com.jusfoun.communication.constant.AutoReplyConstant;
import com.jusfoun.communication.constant.RedisKeyConstant;
import com.jusfoun.communication.dao.AutoReplyDao;
import com.jusfoun.communication.model.AutoReply;
import com.jusfoun.communication.util.PageInfo;
import com.jusfoun.communication.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @author player six
 * @email jslcylcy@163.com
 * @create 2017-12-12 16:45
 **/
@Component
public class AutoReplyDaoImpl implements AutoReplyDao {

    @Autowired
    private RedisUtil redisUtil;

    @Override
    public long listCount(String appId) {
        return redisUtil.zSize(RedisKeyConstant.REDIS_APPINFO + appId + ":" + RedisKeyConstant.REDIS_APP_AUTO_REPLYLIST);
    }

    @Override
    public List<AutoReply> list(String appId, PageInfo pageInfo) {
        if (pageInfo.getStartRow() > 0 && pageInfo.getEndRow() >= pageInfo.getStartRow()) {
            return getAutoReplyByIdList(redisUtil.zRangeByIdx(RedisKeyConstant.REDIS_APPINFO + appId + ":" + RedisKeyConstant.REDIS_APP_AUTO_REPLYLIST, pageInfo.getStartRow() - 1L, pageInfo.getEndRow() - pageInfo.getStartRow() + 1L, true));
        } else {
            return getAutoReplyByIdList(redisUtil.zRangeByIdx(RedisKeyConstant.REDIS_APPINFO + appId + ":" + RedisKeyConstant.REDIS_APP_AUTO_REPLYLIST, 0, pageInfo.getTotal(), true));
        }
    }

    @Override
    public AutoReply add(AutoReply autoReply) {
        Long id = redisUtil.incr(RedisKeyConstant.REDIS_AUTO_REPLYCOUNT, 1);
        redisUtil.zAdd(RedisKeyConstant.REDIS_APPINFO + autoReply.getAppId() + ":" + RedisKeyConstant.REDIS_APP_AUTO_REPLYLIST, String.valueOf(id), System.currentTimeMillis());
        redisUtil.saveHashKey4Null(RedisKeyConstant.REDIS_AUTO_REPLY + id, AutoReplyConstant.REDIS_STORE_PATTERN, autoReply.getPattern());
        redisUtil.saveHashKey4Null(RedisKeyConstant.REDIS_AUTO_REPLY + id, AutoReplyConstant.REDIS_STORE_CONTENT, autoReply.getContent());
        redisUtil.saveHashKey4Null(RedisKeyConstant.REDIS_AUTO_REPLY + id, AutoReplyConstant.REDIS_STORE_LEVEL, autoReply.getLevel().toString());
        autoReply.setId(id);
        return autoReply;
    }

    @Override
    public AutoReply update(AutoReply autoReply) {
        redisUtil.saveHashKey4Null(RedisKeyConstant.REDIS_AUTO_REPLY + autoReply.getId(), AutoReplyConstant.REDIS_STORE_PATTERN, autoReply.getPattern());
        redisUtil.saveHashKey4Null(RedisKeyConstant.REDIS_AUTO_REPLY + autoReply.getId(), AutoReplyConstant.REDIS_STORE_CONTENT, autoReply.getContent());
        redisUtil.saveHashKey4Null(RedisKeyConstant.REDIS_AUTO_REPLY + autoReply.getId(), AutoReplyConstant.REDIS_STORE_LEVEL, autoReply.getLevel().toString());
        return autoReply;
    }

    @Override
    public boolean isUseAutoReply(String appId) {
        String isUse = redisUtil.getItem(RedisKeyConstant.REDIS_APPINFO + appId + RedisKeyConstant.REDIS_USE_AUTO_REPLY);
        return Boolean.parseBoolean(isUse);
    }

    @Override
    public String getAutoReplyBeginTime(String appId) {
        return redisUtil.getItem(RedisKeyConstant.REDIS_APPINFO + appId + RedisKeyConstant.REDIS_AUTO_REPLY_BEGINTIME);
    }

    @Override
    public String getAutoReplyEndTime(String appId) {
        return redisUtil.getItem(RedisKeyConstant.REDIS_APPINFO + appId + RedisKeyConstant.REDIS_AUTO_REPLY_ENDTIME);
    }

    @Override
    public void saveConfigure(String appId, boolean useAutoReply, String autoReplyBegin, String autoReplyEnd) {
        redisUtil.saveItem(RedisKeyConstant.REDIS_APPINFO + appId + RedisKeyConstant.REDIS_USE_AUTO_REPLY, String.valueOf(useAutoReply));
        redisUtil.saveItem(RedisKeyConstant.REDIS_APPINFO + appId + RedisKeyConstant.REDIS_AUTO_REPLY_BEGINTIME, autoReplyBegin);
        redisUtil.saveItem(RedisKeyConstant.REDIS_APPINFO + appId + RedisKeyConstant.REDIS_AUTO_REPLY_ENDTIME, autoReplyEnd);
    }

    @Override
    public void delById(String appId, Long id) {
        redisUtil.zRemove(RedisKeyConstant.REDIS_APPINFO + appId + ":" + RedisKeyConstant.REDIS_APP_AUTO_REPLYLIST, id.toString());
        redisUtil.deleteItem(RedisKeyConstant.REDIS_AUTO_REPLY + id);
    }

    @Override
    public List<AutoReply> listAll(String appId) {
        long size = listCount(appId);
        if (size > 0) {
            return getAutoReplyByIdList(redisUtil.zRangeByIdx(RedisKeyConstant.REDIS_APPINFO + appId
                    + ":" + RedisKeyConstant.REDIS_APP_AUTO_REPLYLIST, 0, size, true));
        }
        return new ArrayList<>();
    }

    private List<AutoReply> getAutoReplyByIdList(Set<String> idList) {
        List<AutoReply> autoReplyList = new ArrayList<>();
        idList.forEach(id -> {
            if (StringUtils.isNotBlank(id)) {
                AutoReply autoReply = getAutoReply(Long.valueOf(id));
                if (null != autoReply) {
                    autoReplyList.add(autoReply);
                }
            }
        });
        return autoReplyList;
    }

    /**
     * 根据id从redis中获取AutoReply
     *
     * @param id
     * @return
     */
    private AutoReply getAutoReply(long id) {
        AutoReply autoReply = new AutoReply();
        String pattern = redisUtil.getHashKey(RedisKeyConstant.REDIS_AUTO_REPLY + id, AutoReplyConstant.REDIS_STORE_PATTERN);
        String content = redisUtil.getHashKey(RedisKeyConstant.REDIS_AUTO_REPLY + id, AutoReplyConstant.REDIS_STORE_CONTENT);
        String level = redisUtil.getHashKey(RedisKeyConstant.REDIS_AUTO_REPLY + id, AutoReplyConstant.REDIS_STORE_LEVEL);
        autoReply.setId(id);
        autoReply.setContent(content);
        autoReply.setPattern(pattern);
        autoReply.setLevel(StringUtils.isNotBlank(level) ? Integer.valueOf(level) : 0);
        return autoReply;
    }

}
